﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//加一

//给定一个由 整数 组成的 非空 数组所表示的非负整数，在该数的基础上加一。
//最高位数字存放在数组的首位， 数组中每个元素只存储单个数字。
//你可以假设除了整数 0 之外，这个整数不会以零开头。

/**
 * Note: The returned array must be malloced, assume caller calls free().
   注意：返回的数组必须是mallocated的，假设调用者调用free（）。
 */
int* plusOne(int* digits, int digitsSize, int* returnSize) {
    for (int i = digitsSize - 1; i >= 0; i--) {
        if (digits[i] != 9) {   //检测数字非9，则进行加一，并及时返回
            digits[i]++;
            break;
        }
        digits[i] = 0;  //当数字为9时，则将它置零（除了数字全为9）
    }
    if (digits[0] == 0) {  //当数字全为9时（这里由于经过上面的循环，首位应该变为0，即99变为00）
        int* temp;    //创建新数组
        int Size = digitsSize + 1; //数组长度应为原数组长度加一
        int k = Size - 1;
        temp = (int*)malloc(Size * sizeof(int));  //需要给数组的指针分配储存空间
        while ((k) != 0) {
            temp[k] = 0;
            k--;
        }
        temp[k] = 1;  //首位置一，其它置零
        *returnSize = Size;  //对返回数组大小进行确认，做这一步主要由于注释和函数要求，结果也证明了最终显示数组的多少依赖这个东西（有可能便于力扣检查吧）
        return temp;
    }
    *returnSize = digitsSize;
    return digits;
}

//删除有序数组中的重复项。

//给你一个 升序排列 的数组 nums ，请你 原地 删除重复出现的元素，使每个元素 只出现一次 ，返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
//考虑 nums 的唯一元素的数量为 k ，你需要做以下事情确保你的题解可以被通过：
//更改数组 nums ，使 nums 的前 k 个元素包含唯一元素，并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
//返回 k 。


int removeDuplicates(int* nums, int numsSize) {
    if (numsSize == 0)
    {
        return 0;
    }
    else
    {
        int fast = 1;
        int slow = 1;
        while (fast < numsSize)
        {
            if (nums[fast] != nums[fast - 1])
            {
                nums[slow] = nums[fast];
                slow++;
            }
            fast++;
        }
        return slow;
    }
}

//移除元素


//给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
//不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
//元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

int removeElement(int* nums, int numsSize, int val) {
    if (numsSize == 0)
    {
        return 0;
    }
    int fast = 0;
    int slow = 0;
    while (fast < numsSize)
    {
        if (nums[fast] != val)
        {
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}


//搜索插入位置


//给定一个排序数组和一个目标值，在数组中找到目标值，并返回其索引。如果目标值不存在于数组中，返回它将会被按顺序插入的位置。
//请必须使用时间复杂度为 O(log n) 的算法。

int searchInsert(int* nums, int numsSize, int target) {
    int left = 0;
    int right = numsSize - 1;
    int ans = numsSize;
    while (left <= right)
    {
        int mid = (right + left) / 2;
        if (target <= nums[mid])
        {
            ans = mid;
            right = mid - 1;
        }
        else
        {
            left = mid + 1;
        }
    }
    return ans;
}

//最后一个单词长度

//给你一个字符串 s，由若干单词组成，单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
//单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。
int lengthOfLastWord(char* s) {
    int len = strlen(s) - 1;
    int count = 0;
    while (s[len] == ' ')
    {
        len--;
    } //防止最后一个是空格
    while (len >= 0 && s[len] != ' ')
    {

        count++;
        len--;

    }
    return count;
}





